package com.groep14.project;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.crypto.password.StandardPasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.groep14.model.Person;

/**
 * De AccountController handelt requests met de Account pagina af.
 * 
 * @since r38 - 5 April 2012
 * @author Maarten Tutak
 *
 */

@Controller
public class AccountController {

	private static final Logger logger = LoggerFactory.getLogger(NavigatieController.class);
	private MyLogger myLogger = new MyLogger();
	private StandardPasswordEncoder encoder;
	
	/**
	 * In de methode account worden de gegevens van de momenteel ingelogde klant opgehaald.
	 * De ingelogde klant vinden we terug in een sessie die word aangemaakt bij het inloggen.
	 * 
	 * @param session
	 * @return ModelAndView
	 */
	
	@RequestMapping(value = "/account",method = RequestMethod.GET)
	public ModelAndView account(HttpSession session) {
		
        ModelAndView modelAndView = new ModelAndView("account");
        Person p = (Person) session.getAttribute("person");
        
        if(p != null) {
	        modelAndView.addObject("lastname", p.getLastname());
	        modelAndView.addObject("firstname", p.getFirstname());
	        modelAndView.addObject("birthday", p.getBirthday());
	        modelAndView.addObject("gender", p.getGender());
	        modelAndView.addObject("phone", p.getPhone());
	        modelAndView.addObject("cellphone", p.getCellphone());
	        modelAndView.addObject("mbox", p.getMbox());
	        modelAndView.addObject("country", p.getCountry());
	        modelAndView.addObject("streetadress", p.getStreetAdress());
	        modelAndView.addObject("zip", p.getZip());	  
	        modelAndView.addObject("admin", p.getAdmin());
        }else {
        	return new ModelAndView("redirect:index");
        }
        
		return modelAndView;
		
	}
	
	/**
	 * De update methode word gebruikt wanneer een klant zijn gegevens wijzigt via een formulier.
	 * De gegevens van het formulier worden doorgegeven dmv de request parameter.
	 * Deze nieuwe gegevens worden dan opnieuw in de database gestoken bij de huidig aangemelde klant, die we terugvinden in de session parameter.
	 * 
	 * @param request
	 * @param session
	 * @return ModelAndView
	 */
	
	@RequestMapping(value = "/update",method = RequestMethod.POST)
	public ModelAndView update(HttpServletRequest request,HttpSession session) {
		
		if(request.getParameter("btnAction").equals("Wijzigen opslaan")) {
			logger.info("Updating account..");
			
			try {
				
				Validator validator = new Validator();
				
				if (validator.validateString(request.getParameter("familienaam"), 0, 50, false, true, false) &&
					validator.validateString(request.getParameter("voornaam"), 0, 50, false, true, false) &&
					validator.validateDate(request.getParameter("geboortedatum")) &&
					validator.validateCellphone(request.getParameter("telefoon")) &&
					validator.validateCellphone(request.getParameter("gsm")) &&
					validator.validateString(request.getParameter("adres"), 0, 50, true, true, false) &&
					validator.validateNumber(request.getParameter("postcode"), 1000, 9999, true)
					) {
					
					Connectie con = new Connectie();
					Person p = (Person) session.getAttribute("person");
					String old_password = "";
					ResultSet result;
					
					con.setpStatement(con.getCon().prepareStatement("SELECT password FROM persons WHERE Pers_id = ?"));
					con.getpStatement().setInt(1, p.getPers_id());
					
					result = con.getpStatement().executeQuery();
					
					if(result.next()) {
						old_password = result.getString("Password");
					} else {
						//wachtwoord niet gevonden?
						throw new Exception("Server couldn't find your password");
					}
					
					con.setpStatement(con.getCon().prepareStatement("UPDATE persons SET Lastname = ?, Firstname = ?, Birthday = ?, Gender = ?, Phone = ?, Cellphone = ?, Mbox = ?, Country = ?, StreetAdress = ?, Zip = ?, Password = ? WHERE Pers_id = ?"));
					
					con.getpStatement().setString(1, request.getParameter("familienaam"));
					con.getpStatement().setString(2, request.getParameter("voornaam"));
					con.getpStatement().setObject(3, request.getParameter("geboortedatum")); //date
					con.getpStatement().setString(4, request.getParameter("geslacht"));
					con.getpStatement().setString(5, request.getParameter("telefoon"));
					con.getpStatement().setString(6, request.getParameter("gsm"));
					con.getpStatement().setString(7, request.getParameter("email"));
					con.getpStatement().setString(8, request.getParameter("land"));
					con.getpStatement().setString(9, request.getParameter("adres"));
					con.getpStatement().setString(10, request.getParameter("postcode"));
					
					//
						encoder = new StandardPasswordEncoder(request.getParameter("email"));
											
						if(encoder.matches(request.getParameter("oud_wachtwoord"), old_password)) {						
							if((!request.getParameter("nieuw_wachtwoord").equals("")) && (!request.getParameter("herhaal_wachtwoord").equals(""))) {
								if(request.getParameter("nieuw_wachtwoord").equals(request.getParameter("herhaal_wachtwoord"))) {
									String encodedPassword = encoder.encode(request.getParameter("nieuw_wachtwoord"));
									con.getpStatement().setString(11,encodedPassword);
								} else {
									//nieuw wachtwoord niet gelijk aan herhaal wachtwoord.
									logger.info("Old password and repeat password are not the same !");
									return new ModelAndView("redirect:account");
								}
							} else {
								//Nieuw wachtword niet ingevuld. --> wachtwoord word niet gewijzigd.
								String encodedPassword = encoder.encode(request.getParameter("oud_wachtwoord"));
								con.getpStatement().setString(11, encodedPassword); //wachtwoord altijd invullen om iets aan account te wijzigen
							}						
						} else {
							//Oud wachtwoord is verkeerd.
							logger.info("Old password is wrong !");
							return new ModelAndView("redirect:account");
						}
					//
									
					con.getpStatement().setInt(12, p.getPers_id());
				
					if(con.getpStatement().executeUpdate() > 0) {
						logger.info("Account update geslaagd !");
						
						//Update session to match new data !
						logger.info("Updating session..");
						
						p.setFirstname(request.getParameter("voornaam"));
						p.setLastname(request.getParameter("familienaam"));
						p.setBirthday(java.sql.Date.valueOf(request.getParameter("geboortedatum")));
						p.setGender(request.getParameter("geslacht"));
						p.setPhone(request.getParameter("telefoon"));
						p.setCellphone(request.getParameter("gsm"));
						p.setMbox(request.getParameter("email"));
						p.setCountry(request.getParameter("land"));
						p.setStreetAdress(request.getParameter("adres"));
						p.setZip(request.getParameter("postcode"));
						
						session.removeAttribute("person");
						session.setAttribute("person", p);					
					} else {
						logger.info("Account update failed..");
						return new ModelAndView("redirect:account");
					}
					
				} else {
					logger.info("Not valid");
				}

			} catch (SQLException e) {
				myLogger.logException(getClass() + " - ", e);
			} catch (ClassNotFoundException e) {
				myLogger.logException(getClass() + " - ", e);
			} catch (InstantiationException e) {
				myLogger.logException(getClass() + " - ", e);
			} catch (IllegalAccessException e) {
				myLogger.logException(getClass() + " - ", e);
			} catch (ParseException e) {
				myLogger.logException(getClass() + " - ", e);
			} catch (Exception e) {
				myLogger.logException(getClass() + " - ", e);
			}
			
		} else {
			logger.info("Cancelled accountupdate..");
		}
		
		return new ModelAndView("redirect:index");
		
	}
}
